/**
 *  XLogin.js
 *  author xyang create by 2021/7/2
 *
 *  实现: 该文件导出一个构造函数, 意味着 XLogin() 是可执行的
 *
 *
 *  使用方法:
 *  import XLogin from './plugins/x-login/index'
 *  自定义配置项
 *  params: interval 心跳检测间隔分钟
 *  params: loginPagePath 系统当前的Login页面
 *  XLogin.setConfig({ interval: 30, loginPagePath: 'login' })
 *
 *  Vue.prototype.$login = XLogin
 *
 *  this.$login() 或者 XLogin()
 */
import Vue from 'vue'
import xLogin from './XLogin'
import store from '@/store'

// 用 Vue.extend 创建组件的模板（构造函数）
const MainConstructor = Vue.extend(xLogin)

XLogin.config = {
  interval: 30,
  loginPagePath: 'login'
}
XLogin.instance = null
function XLogin (options = {}) {
  if (window.location.href.indexOf(XLogin.config.loginPagePath) > -1) {
    // console.log('已经在登录页面, 不需要重复唤醒登录Dialog组件')
    return
  }

  if (XLogin.instance) {
    // console.log('重复唤醒登录Dialog组件')
    return
  }
  // 清空token
  store.dispatch('user/resetToken')

  XLogin.instance = new MainConstructor().$mount() // 渲染组件
  document.body.appendChild(XLogin.instance.$el) // 挂载到 body 下

  // 监听消失
  XLogin.instance.$watch('visible', val => {
    if (val === false) {
      XLogin.instance = null
    }
  })
}

// 关闭全部的登录框
XLogin.closeAll = function () {
  if (!XLogin.instance) {
    // console.log('没有可关闭的Xlogin dialog')
    return
  }
  XLogin.instance.closeDialog()
  XLogin.instance = null
}

// 设置config
XLogin.setConfig = function (config) {
  XLogin.config = { ...XLogin.config, ...config }
}

// 开启定时器轮询用户信息接口, token失败就直接在页面触发XLogin
const minute = 1000 * 60
setInterval(() => {
  // 发送心跳包
  // console.log('开始检测心跳包')
  // store.dispatch('user/getInfo').then(res => {
  //   // console.log('检测心跳包成功')
  // }).catch(err => {
  //   XLogin()
  //   console.log('检测用户Token失效, 提醒用户登录', err)
  // })
}, minute * XLogin.config.interval)
export default XLogin
